package ar.uba.is2.ec.comm.impl;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;

import org.apache.log4j.Logger;

import ar.uba.is2.common.mensaje.Mensaje;
import ar.uba.is2.common.mensaje.Receptor;
import ar.uba.is2.common.mensaje.TipoMensaje;
import ar.uba.is2.common.mensaje.protocolo.Protocolo;
import ar.uba.is2.ec.comm.ModuloComunicacion;

public class ModuloComunicacionImpl implements ModuloComunicacion {

	Logger log = Logger.getLogger(ModuloComunicacionImpl.class);
	private Protocolo protocolo;
	private Collection<Receptor> receptoresUniversales;
	private Map<TipoMensaje, Collection<Receptor>> receptoresXtipoMensaje;
	
	public ModuloComunicacionImpl(){
		this.receptoresUniversales = new HashSet<Receptor>();
		this.receptoresXtipoMensaje = new HashMap<TipoMensaje, Collection<Receptor>>();
	}
	
	public void enviarMensaje(Mensaje msj) {
		this.protocolo.enviarMensaje(msj);
	}
	
	public void recibirMensaje(Mensaje mensaje) {
		log.debug("El modulo de comunicacion recibio el mensaje " + mensaje.getNumeroMensaje());
		for (Receptor receptor : receptoresUniversales) {
			receptor.recibirMensaje(mensaje);
		}
	}

	public void registrarReceptor(Receptor receptor) {
		if (receptor != null)
			receptoresUniversales.add(receptor);
	}

	@Override
	public void registrarReceptor(Receptor receptor, TipoMensaje tipoMensaje) {
		Collection<Receptor> receptores = this.receptoresXtipoMensaje.get(tipoMensaje);
		
		if (receptores == null) {
			receptores = new ArrayList<Receptor>();
		}

		receptores.add(receptor);
	}

	public void setProtocolo(Protocolo protocolo) {
		this.protocolo = protocolo;
	}

}
